# -*- coding=utf-8 -*-
#第四版对第三版做出改进，os.system对命令行的调用改为zipfile标准库
#缺点，目前只能一个个目录进行备份。
#优点：不依赖于操作系统安装zip软件
import os
import time
import zipfile
# 需要备份的文件与目录将被指定在一个列表中
# 例如windows下

#源目录，源地址
source = 'J:\\PyWorkSpace\\byte-of-python'

#目的地址，备份文件存放的位置
target_dir = 'D:\\backup'

#接下来是不同于第一版的
#如果主目录不存在就创建目录
if not os.path.exists(target_dir):
    os.mkdir(target_dir)
#将当前日期作为主备份目录下的子目录名称
today = target_dir + os.sep + time.strftime('%Y%m%d')
#将当前时间作为zip文件名
now = time.strftime('%H%M%S')
##########################################
#接下来是不同于第二版的

#zip文件名
comment = input('Enter a comment -->')
# 检查是否有评论键入,使用input函数来接受用户的注释内容
if len(comment) == 0:
    target = today + os.sep + now + '.zip'
else:
    target = today + os.sep + now + '_' + \
    comment.replace(' ','_') + '.zip'

##########################################

#如果子目录不存在则创建一个
if not os.path.exists(today):
    os.mkdir(today)
    print('Successfully created directory', today)

# 使用zipfile创建文件,w是创建zip文件，r是读取zip文件
backupfile = zipfile.ZipFile(target, 'w', zipfile.ZIP_DEFLATED)
#遍历文件，将文件列表放在fileList中
fileList = []
#os.walk是一个简单易用的文件、目录遍历器
#可以帮助我们高效的处理文件、目录方面的事情。
#每次遍历的对象都返回一个三元组（dirs,dirnames,filenames）
# dirs是指当前正在遍历的这个文件夹本身的地址,下面用dirpath表示
# dirnames是一个list，内容是该文件夹下所有目录的名字（不包括下级的子目录）
# filenames也是list,内容是该文件夹下所有文件，不包括子目录中的文件
for dirpath,dirnames,filenames in os.walk(source):
    for filename in filenames:
        fileList.append(os.path.join(dirpath,filename))
print('fileList is:')
print('\n'.join(fileList))
# 运行备份
for tar in fileList:
    backupfile.write(tar) #文件列表中的文件写入搭配backupfile中去
backupfile.close() #必须调用，否则无法结束。
print('backup to',target)